Micron Document
welo git mirrors

Node / public / reticulum / files / RNS / Interfaces / LocalInterface.py

Displaying Raw • Download

RNS/Interfaces/LocalInterface.py 0.7.5 (5914e8a8) Text, 13.93 KB

T8b949e# MIT License
T8b949e#
T8b949e# Copyright (c) 2016-2023 Mark Qvist / unsigned.io
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# The above copyright notice and this permission notice shall be included in all
T8b949e# copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.

Tff7b72from T7ee787.T7ee787Interface Tff7b72import Te6edf3Interface
Tff7b72import T7ee787socketserver
Tff7b72import T7ee787threading
Tff7b72import T7ee787socket
Tff7b72import T7ee787time
Tff7b72import T7ee787sys
Tff7b72import T7ee787os
Tff7b72import T7ee787RNS
Tff7b72from T7ee787threading Tff7b72import Te6edf3Lock

Tff7b72class T56d364HDLCTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3FLAG Tff7b72= T79c0ff0x7E
Te6edf3ESC Tff7b72= T79c0ff0x7D
Te6edf3ESC_MASK Tff7b72= T79c0ff0x20

Tf0883e@staticmethod
Tff7b72def Td2a8ffescapeTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8ffreplaceTb4b4b4(Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4]Tb4b4b4)Tb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4, Te6edf3HDLCTff7b72.Td2a8ffESCTff7b72^Te6edf3HDLCTff7b72.Td2a8ffESC_MASKTb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8ffreplaceTb4b4b4(Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)Tb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4, Te6edf3HDLCTff7b72.Td2a8ffFLAGTff7b72^Te6edf3HDLCTff7b72.Td2a8ffESC_MASKTb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3data

Tff7b72class T56d364ThreadingTCPServerTb4b4b4(Te6edf3socketserverTff7b72.Td2a8ffThreadingMixInTb4b4b4, Te6edf3socketserverTff7b72.Td2a8ffTCPServerTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffserver_bindTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_windowsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSOL_SOCKETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSO_EXCLUSIVEADDRUSETb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSOL_SOCKETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSO_REUSEADDRTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffbindTb4b4b4(Tff7b72selfTff7b72.Td2a8ffserver_addressTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffserver_address Tff7b72= Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffgetsocknameTb4b4b4(Tb4b4b4)

Tff7b72class T56d364LocalClientInterfaceTb4b4b4(Te6edf3InterfaceTb4b4b4)Tb4b4b4:
Te6edf3RECONNECT_WAIT Tff7b72= T79c0ff8

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3target_port Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3connected_socketTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tb4b4b4)

T8b949e# TODO: Remove at some point
T8b949e# self.rxptime = 0
Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= T79c0ff1064

Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffIN Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffOUT Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffreconnecting Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffnever_connected Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffdetached Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Te6edf3name
Tff7b72selfTff7b72.Td2a8ffmode Tff7b72= Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_FULL

Tff7b72if Te6edf3connected_socket Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceives Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftarget_ip Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftarget_port Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72= Te6edf3connected_socket
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4, Te6edf3socketTff7b72.Td2a8ffTCP_NODELAYTb4b4b4, T79c0ff1Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instance Tff7b72= Tff7b72False

Tff7b72elif Te6edf3target_port Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceives Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftarget_ip Tff7b72= Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"
Tff7b72selfTff7b72.Td2a8fftarget_port Tff7b72= Te6edf3target_port
Tff7b72selfTff7b72.Td2a8ffconnectTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72= T79c0ff1000Tff7b72*T79c0ff1000Tff7b72*T79c0ff1000
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffwriting Tff7b72= Tff7b72False

Tff7b72selfTff7b72.Td2a8ff_force_bitrate Tff7b72= Tff7b72False

Tff7b72selfTff7b72.Td2a8ffannounce_rate_target Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffannounce_rate_grace Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffannounce_rate_penalty Tff7b72= Tff7b72None

Tff7b72if Te6edf3connected_socket Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffread_loopTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffshould_ingress_limitTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False

Tff7b72def Td2a8ffconnectTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_INETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_STREAMTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4, Te6edf3socketTff7b72.Td2a8ffTCP_NODELAYTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffconnectTb4b4b4(Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftarget_ipTb4b4b4, Tff7b72selfTff7b72.Td2a8fftarget_portTb4b4b4)Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instance Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffnever_connected Tff7b72= Tff7b72False

Tff7b72return Tff7b72True


Tff7b72def Td2a8ffreconnectTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffreconnectingTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreconnecting Tff7b72= Tff7b72True
Te6edf3attempts Tff7b72= T79c0ff0

Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8ffonlineTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LocalClientInterfaceTff7b72.Td2a8ffRECONNECT_WAITTb4b4b4)
Te6edf3attempts Tff7b72+Tff7b72= T79c0ff1

Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconnectTb4b4b4(Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffConnection attempt for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff failed: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffnever_connectedTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReconnected socket for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffreconnecting Tff7b72= Tff7b72False
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffread_loopTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffjobTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LocalClientInterfaceTff7b72.Td2a8ffRECONNECT_WAITTff7b72+T79c0ff2Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffshared_connection_reappearedTb4b4b4(Tb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAttempt to reconnect on a non-initiator shared local interface. This should not happen.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72raise Tf85149IOErrorTb4b4b4(Ta5d6ff"Ta5d6ffAttempt to reconnect on a non-initiator local interfaceTa5d6ff"Tb4b4b4)


Tff7b72def Td2a8ffprocessIncomingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffparent_interfaceTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8ffrxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
T8b949e# TODO: Remove at some point
T8b949e# processing_start = time.time()
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffinboundTb4b4b4(Te6edf3dataTb4b4b4, Tff7b72selfTb4b4b4)

T8b949e# TODO: Remove at some point
T8b949e# duration = time.time() - processing_start
T8b949e# self.rxptime += duration

Tff7b72def Td2a8ffprocessOutgoingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffonlineTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwriting Tff7b72= Tff7b72True

Tff7b72if Tff7b72selfTff7b72.Td2a8ff_force_bitrateTb4b4b4:
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffsend_lockTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsend_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)

Tff7b72with Tff7b72selfTff7b72.Td2a8ffsend_lockTb4b4b4:
Te6edf3s Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72/ Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72* T79c0ff8
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSimulating latency of Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettytimeTb4b4b4(Te6edf3sTb4b4b4)Tffd700}Ta5d6ff for Tffd700{Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)Tffd700}Ta5d6ff bytesTa5d6ff"Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3sTb4b4b4)

Te6edf3data Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)Tff7b72+Te6edf3HDLCTff7b72.Td2a8ffescapeTb4b4b4(Te6edf3dataTb4b4b4)Tff7b72+Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsendallTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwriting Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fftxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffparent_interfaceTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8fftxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffException occurred while transmitting via Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, tearing down interfaceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8ffread_loopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3in_frame Tff7b72= Tff7b72False
Te6edf3escape Tff7b72= Tff7b72False
Te6edf3data_buffer Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"

Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3data_in Tff7b72= Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffrecvTb4b4b4(T79c0ff4096Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3data_inTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3pointer Tff7b72= T79c0ff0
Tff7b72while Te6edf3pointer Tff7b72< Tffa657lenTb4b4b4(Te6edf3data_inTb4b4b4)Tb4b4b4:
Te6edf3byte Tff7b72= Te6edf3data_inTb4b4b4[Te6edf3pointerTb4b4b4]
Te6edf3pointer Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tb4b4b4(Te6edf3in_frame Tff7b72and Te6edf3byte Tff7b72== Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4)Tb4b4b4:
Te6edf3in_frame Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffprocessIncomingTb4b4b4(Te6edf3data_bufferTb4b4b4)
Tff7b72elif Tb4b4b4(Te6edf3byte Tff7b72== Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4)Tb4b4b4:
Te6edf3in_frame Tff7b72= Tff7b72True
Te6edf3data_buffer Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72elif Tb4b4b4(Te6edf3in_frame Tff7b72and Tffa657lenTb4b4b4(Te6edf3data_bufferTb4b4b4) Tff7b72< Tff7b72selfTff7b72.Td2a8ffHW_MTUTb4b4b4)Tb4b4b4:
Tff7b72if Tb4b4b4(Te6edf3byte Tff7b72== Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4)Tb4b4b4:
Te6edf3escape Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72if Tb4b4b4(Te6edf3escapeTb4b4b4)Tb4b4b4:
Tff7b72if Tb4b4b4(Te6edf3byte Tff7b72== Te6edf3HDLCTff7b72.Td2a8ffFLAG Tff7b72^ Te6edf3HDLCTff7b72.Td2a8ffESC_MASKTb4b4b4)Tb4b4b4:
Te6edf3byte Tff7b72= Te6edf3HDLCTff7b72.Td2a8ffFLAG
Tff7b72if Tb4b4b4(Te6edf3byte Tff7b72== Te6edf3HDLCTff7b72.Td2a8ffESC Tff7b72^ Te6edf3HDLCTff7b72.Td2a8ffESC_MASKTb4b4b4)Tb4b4b4:
Te6edf3byte Tff7b72= Te6edf3HDLCTff7b72.Td2a8ffESC
Te6edf3escape Tff7b72= Tff7b72False
Te6edf3data_buffer Tff7b72= Te6edf3data_bufferTff7b72+Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3byteTb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instance Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffdetachedTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSocket for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff was closed, attempting to reconnect...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffshared_connection_disappearedTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffreconnectTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffteardownTb4b4b4(Te6edf3nowarningTff7b72=Tff7b72TrueTb4b4b4)

Tff7b72break

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn interface error occurred, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTearing down Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffdetachTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsocketTb4b4b4, Ta5d6ff"Ta5d6ffcloseTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffcloseTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDetaching Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdetached Tff7b72= Tff7b72True
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffshutdownTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSHUT_RDWRTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while shutting down socket for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)

Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while closing socket for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72= Tff7b72None

Tff7b72def Td2a8ffteardownTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nowarningTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffOUT Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffIN Tff7b72= Tff7b72False

Tff7b72if Tff7b72self Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTff7b72.Td2a8ffremoveTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72if Tff7b72self Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8fflocal_client_interfacesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8fflocal_client_interfacesTff7b72.Td2a8ffremoveTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffparent_interfaceTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8ffclients Tff7b72-Tff7b72= T79c0ff1
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Ta5d6ff"Ta5d6ffownerTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffowner Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffownerTff7b72.Td2a8ff_should_persist_dataTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3nowarning Tff7b72== Tff7b72FalseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff experienced an unrecoverable error and is being torn down. Restart Reticulum to attempt to open this interface again.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffpanic_on_interface_errorTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72if Te6edf3nowarning Tff7b72== Tff7b72FalseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPermanently lost connection to local shared RNS instance. Exiting now.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_CRITICALTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffexitTb4b4b4(Tb4b4b4)


Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffLocalInterface[Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8fftarget_portTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff]Ta5d6ff"


Tff7b72class T56d364LocalServerInterfaceTb4b4b4(Te6edf3InterfaceTb4b4b4)Tb4b4b4:

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4, Te6edf3bindportTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffclients Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffIN Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffOUT Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Ta5d6ff"Ta5d6ffReticulumTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffmode Tff7b72= Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_FULL

Tff7b72if Tb4b4b4(Te6edf3bindport Tff7b72!= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceives Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffbind_ip Tff7b72= Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffbind_port Tff7b72= Te6edf3bindport

Tff7b72def Td2a8ffhandlerFactoryTb4b4b4(Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffcreateHandlerTb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3LocalInterfaceHandlerTb4b4b4(Te6edf3callbackTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)
Tff7b72return Te6edf3createHandler

Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72selfTff7b72.Td2a8ffis_local_shared_instance Tff7b72= Tff7b72True

Te6edf3address Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffbind_ipTb4b4b4, Tff7b72selfTff7b72.Td2a8ffbind_portTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffserver Tff7b72= Te6edf3ThreadingTCPServerTb4b4b4(Te6edf3addressTb4b4b4, Te6edf3handlerFactoryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffincoming_connectionTb4b4b4)Tb4b4b4)

Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffserverTff7b72.Td2a8ffserve_foreverTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffannounce_rate_target Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffannounce_rate_grace Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffannounce_rate_penalty Tff7b72= Tff7b72None

Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72= T79c0ff1000Tff7b72*T79c0ff1000Tff7b72*T79c0ff1000
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True



Tff7b72def Td2a8ffincoming_connectionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3interface_name Tff7b72= Tffa657strTb4b4b4(Tffa657strTb4b4b4(Te6edf3handlerTff7b72.Td2a8ffclient_addressTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3spawned_interface Tff7b72= Te6edf3LocalClientInterfaceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffownerTb4b4b4, Te6edf3nameTff7b72=Te6edf3interface_nameTb4b4b4, Te6edf3connected_socketTff7b72=Te6edf3handlerTff7b72.Td2a8ffrequestTb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffOUT Tff7b72= Tff7b72selfTff7b72.Td2a8ffOUT
Te6edf3spawned_interfaceTff7b72.Td2a8ffIN Tff7b72= Tff7b72selfTff7b72.Td2a8ffIN
Te6edf3spawned_interfaceTff7b72.Td2a8fftarget_ip Tff7b72= Te6edf3handlerTff7b72.Td2a8ffclient_addressTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3spawned_interfaceTff7b72.Td2a8fftarget_port Tff7b72= Tffa657strTb4b4b4(Te6edf3handlerTff7b72.Td2a8ffclient_addressTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffparent_interface Tff7b72= Tff7b72self
Te6edf3spawned_interfaceTff7b72.Td2a8ffbitrate Tff7b72= Tff7b72selfTff7b72.Td2a8ffbitrate
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ff_force_bitrateTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3spawned_interfaceTff7b72.Td2a8ff_force_bitrate Tff7b72= Tff7b72selfTff7b72.Td2a8ff_force_bitrate
T8b949e# RNS.log("Accepting new connection to shared instance: "+str(spawned_interface), RNS.LOG_EXTREME)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3spawned_interfaceTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8fflocal_client_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3spawned_interfaceTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffclients Tff7b72+Tff7b72= T79c0ff1
Te6edf3spawned_interfaceTff7b72.Td2a8ffread_loopTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffprocessOutgoingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72pass

Tff7b72def Td2a8ffreceived_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_spawnedTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3from_spawnedTb4b4b4: Tff7b72selfTff7b72.Td2a8ffia_freq_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffsent_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_spawnedTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3from_spawnedTb4b4b4: Tff7b72selfTff7b72.Td2a8ffoa_freq_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffShared Instance[Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbind_portTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff]Ta5d6ff"

Tff7b72class T56d364LocalInterfaceHandlerTb4b4b4(Te6edf3socketserverTff7b72.Td2a8ffBaseRequestHandlerTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72= Te6edf3callback
Te6edf3socketserverTff7b72.Td2a8ffBaseRequestHandlerTff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)

Tff7b72def Td2a8ffhandleTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4(Te6edf3handlerTff7b72=Tff7b72selfTb4b4b4)

Served by rngit 1.5.1 - Generated in 0.16s